home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / fractal / kaos.lha / complib / map_implicit_backward.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-01-27  |  2.2 KB  |  89 lines

  1. /*
  2. ### Implicit backward mapping ###
  3.  
  4. Bug: No polar coords allowed for maps at the moment
  5.     The order of orbits mess up if ir>1.
  6. */
  7.  
  8. #define DELFRAC 0.2
  9.  
  10. int map_implicit_backward()
  11. {
  12.     int i,it,color,ndid;
  13.     double delx,time,*vn1,*vn2,*vn,*dvector(),xerr,tmp;
  14.     void free_dvector();
  15.     extern int nok,nbad,forward_toggle,stop,var_dim,i_max,polar_coord,fi_maxsq,ir;
  16.     extern int fp_display_option,ir;
  17.     extern double fi_eps,fi_epsf,cutoff,*win_var_i,*win_var_f,*param,*t_vf;
  18.     extern int (*f_p)();
  19.     extern char string[];
  20.     
  21.     stop = 0;
  22.     vn = dvector(0,var_dim-1);
  23.     vn1 = dvector(0,var_dim-1);
  24.     vn2 = dvector(0,var_dim-1);
  25.  
  26.     if(ir ==0){
  27.         system_mess_proc(1,"Period=0 not acceptable. Change period in periodic orbit window.");
  28.         goto done;
  29.     }
  30.  
  31.     /* initialize from window variable */
  32.     from_window_variables(vn,win_var_i,polar_coord);
  33.  
  34.     /* draw first point */
  35.     to_full_variables(t_vf,vn,polar_coord);
  36.     (void) draw_record_orbit(t_vf,0,0);
  37.  
  38.     for(i=0;i<var_dim;i++) vn2[i]=vn[i];
  39.     fmap_user(vn2,ir,var_dim);
  40.     for(i=0;i<var_dim;i++) {
  41.         delx = vn[i] - vn2[i];
  42.         vn2[i] = vn[i] + delx;
  43.         vn1[i] = vn2[i] + DELFRAC * delx;
  44.     }
  45.  
  46.     /* main loop */
  47.     for (it=1;it<=i_max;it += ir){
  48.         /* check divergence */
  49.         for(i=0;i<var_dim;i++) {
  50.             if(vn[i] > cutoff || vn[i] < -cutoff) {
  51.                 system_mess_proc(1,"Orbits appear to diverge off to an infinity! Stop!");
  52.                 goto done;
  53.             }
  54.         }
  55.         /* initial second guess seperated by a fraction of a distance 
  56.         between an orbit and its image */
  57.         (void) fmapi_user(vn1,vn2,vn,fi_maxsq,var_dim,ir,fi_eps,fi_epsf,&xerr,&ndid);
  58.         (ndid >= fi_maxsq) ? nbad++ : nok++; 
  59.         to_full_variables(t_vf,vn1,polar_coord);
  60.         (void) draw_record_orbit(t_vf,it,1);
  61.         if(fp_display_option==1 && ir>1){
  62.             /* skip the first ir-1 orbits from recording */
  63.             if(it ==1)
  64.                 draw_record_other_orbit(t_vf,it,0,ir);
  65.             else
  66.                 draw_record_other_orbit(t_vf,it,1,ir);
  67.         }
  68.         for(i=0;i<var_dim;i++) {
  69.             delx = vn1[i] - vn[i];
  70.             vn[i] = vn1[i];
  71.             vn2[i] = vn[i] + delx;
  72.             vn1[i] = vn2[i] + DELFRAC * delx;
  73.         }
  74.         if(stop ) {
  75.             goto done;
  76.         }
  77.     }
  78.     
  79. done:
  80.     /* to window variable */
  81.     for(i=0;i<var_dim;i++)
  82.         win_var_f[i]=vn[i];
  83.     sprintf(string,"Inverse Map: nok=%d nbad=%d\n",nok,nbad);
  84.     system_mess_proc(0,string);
  85.     free_dvector(vn,0,var_dim-1);
  86.     free_dvector(vn1,0,var_dim-1);
  87.     free_dvector(vn2,0,var_dim-1);
  88. }
  89.